管理大型 Python 工程结构
Python 语言十分易学,随便创建一个文件即可编码。甚至很多优秀的科学计算项目,仅一个 Jupyter Notebook 搞定。但是,对于复杂工程而言,单文件容纳不下了,需要大量的源代码文件和模块构成。
在其他语言中,比如 Node.js 或者 Dart(Flutter),通过官方脚手架能够方便地搭建一个标准化工程。对于开发者来说,只需要基于此添砖加瓦、导入依赖即可。
标准化的 Python 工程是怎么样的呢?如何开发一个包含有多文件、多模块的大型 Python 工程呢?
在本文中,记录了我的探索。
Kenneth Reitz 的工程布局
Kenneth Reitz 是谁?他是 requests、pipenv、pep8.org 的作者,Python 大神。他曾在 2013 年推荐了一种 Python 工程布局。
参考文献:
- 《Repository Structure and Python》:Kenneth Reitz 的原始博客
- 《Structuring Your Project — The Hitchhiker's Guide to Python (python-guide.org)》:对原始博客进行进一步解读。
本文中不再赘述,直接参见这两篇文章即可。
Python 虚拟环境
Python 虚拟环境是进行 Python 开发的最佳实践。针对每个 Python 工程,都创建一个与之对应的虚拟 Python 环境,在环境中管理该工程的依赖。这样,不同 Python 工程的依赖相互隔离,避免了发生冲突的情况。
在下一节要介绍的 Python 依赖管理工具中,都具备了管理 Python 虚拟环境的功能。
PEP 518
Python 本身, 也针对工程化和依赖管理进行了完善。
在 PEP 518 中,引入新的 pyproject.toml 来取代 Pipfile、requirements.txt、setup.py、setup.cfg、MANIFEST.in 等配置文件。
在后续的 PEP 621 得到了进一步扩展。
Python 依赖管理工具
得益于强大的生态,Python 下也有许多脚手架工具,能够帮助开发者创建更符合标准的 Python 工程,以及更方便地管理依赖。
比如,Kenneth Reitz 的 Pipenv 就是这样一个脚手架工具,十分强大。
除了 Pipenv 外,此类工具还有很多:Poetry、PDM、hatch。
我目前使用 Poetry,后面准备分别尝试下 PDM 和 hatch。至于哪个更好,则仁者见仁智者见智,可以参阅如下参考文献:
参考文献:
- 《pipenv vs. virtualenv vs. poetry vs. pyenv vs. pip - Ritza Articles》
- 《相比 Pipenv,Poetry 是一个更好的选择 - 知乎》
- 《再見了 pip!最佳 Python 套件管理器——Poetry 完全入門指南 - Code and Me》
- 《I move from pipenv to poetry in 2023 - Am I right ? - DEV Community》
- 《Python包管理工具之 PDM-腾讯云开发者社区-腾讯云》
- 《10.2 细数 Python 虚拟环境的管理方案 - 少数派》
- 《Pipenv, pip-tools, PDM, or Poetry? : r/Python》
- 《初見 PDM,一套現代化的 Python 依賴管理工具》
实际 Python 工程结构
经过前面的介绍,实际 Python 项目工程的结构如何呢?这一节中,我会找一些知名 Python 项目,来进行对比。
qutebrowser
第一个选择的案例是 qutebrowser,这是一个使用 Python 开发的,基于 PyQt 的浏览器,特点是基于键盘驱动。
项目布局如下:
- qutebrowser
- doc:文档目录
- misc:资源目录
- qutebrowser:源代码目录
__main__.py
:程序入口
- scripts:各种脚本目录
- tests:测试目录
- www:资源目录
- qutebrowser.py:又一个程序入口
- requirements.txt:依赖
- MANIFEST.in:发布时文件包含
- setup.py:用于描述 Python 项目和如何将其打包的脚本
本文作者:Maeiee
本文链接:管理大型 Python 工程结构
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!